package org.farec.tcc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.farec.tcc.modelo.Categoria;

public class CategoriaDAO {
	
	private Connection connection;
	
	public CategoriaDAO(Connection connection)
	{
		this.connection = connection;
	}

	public void adiciona(Categoria categoria)
	{
		String sql = "INSERT INTO categoria(nome,idempresa) VALUES(?,?)";
		try
		{
			//Prepara o statement para insercao
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			//seta os dados
			stmt.setString(1, categoria.getNome());
			stmt.setInt(2, categoria.getCodEmpresa());
			
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public List<Categoria> getLista()
	{
		List<Categoria> categorias = new ArrayList<Categoria>();
		
		return categorias;
	}
	
	public List<Categoria> getLista(int codEmpresa)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("SELECT * from categoria WHERE idempresa=? order by id");
			
			stmt.setInt(1, codEmpresa);
			
			ResultSet rs = stmt.executeQuery();
			List<Categoria> categorias = new ArrayList<Categoria>();
			
			while(rs.next())
			{
				//Criando um nova instancia
				Categoria categoria = new Categoria();
				categoria.setCodigo(rs.getInt("id"));
				categoria.setNome(rs.getString("nome"));
									
				//Adicionando objeto a lista
				categorias.add(categoria);
			}
			
			rs.close();
			stmt.close();
			return categorias;
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public void altera(Categoria categoria)
	{
		String sql = "UPDATE categoria SET nome=? where id=? and idempresa=?";
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, categoria.getNome());
			stmt.setInt(2, categoria.getCodigo());
			stmt.setInt(3, categoria.getCodEmpresa());
			
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public void remove(Categoria categoria)

	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("DELETE from categoria where id=? and idempresa=?");
			stmt.setLong(1, categoria.getCodigo());
			stmt.setInt(2, categoria.getCodEmpresa());
				
			stmt.execute();
			stmt.close();
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
	}
	
	public Categoria buscaPorCodigo(int codEmpresa, int codigo)
	{
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("SELECT * from categoria where id=? and idempresa=?");
			
			stmt.setInt(1, codigo);
			stmt.setInt(2, codEmpresa);
			
			ResultSet rs = stmt.executeQuery();
			Categoria categoria = new Categoria();
			if(rs.next())
			{
				//Criando um nova instancia
				categoria.setCodigo(rs.getInt("id"));
				categoria.setNome(rs.getString("nome"));
			
			}
			rs.close();
			stmt.close();
			return categoria;
			
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		
	}
	
	
	public Categoria getCategoria(Categoria categoria)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select nome from categoria where nome ILIKE ? and idempresa=?");
			stmt.setString(1, categoria.getNome());
			stmt.setInt(2, categoria.getCodEmpresa());
			
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				categoria.setAlerta(true);
			}
			
			else
			{
				categoria.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return categoria;
		
	}
	
	public Categoria getCategoriaUp(Categoria categoria)
	{
		ResultSet rs;
		try
		{
			PreparedStatement stmt = this.connection.prepareStatement("select nome from categoria where nome ILIKE ? and idempresa=? and id !=?");
			stmt.setString(1, categoria.getNome());
			stmt.setInt(2, categoria.getCodEmpresa());
			stmt.setInt(3, categoria.getCodigo());
			rs=stmt.executeQuery();
			
			if(rs.next())
			{
				categoria.setAlerta(true);
			}
			
			else
			{
				categoria.setAlerta(false);
			}
			stmt.close();
			rs.close();
		
		}
		
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}
		return categoria;
		
	}
}
